﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.IO;
using System.Windows.Forms;
using System.Threading;

namespace weiqijiance.信号处理模块
{
    public class DACnewtian : DACBase
    {

        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="sSet1">串口设置</param>
        /// <returns>是否成功打开</returns>
        public override bool openCOM(string sSet1)
        {
            commex = new SerialPort();
            bool breturn = base.openCOM(sSet1);
            commex.ReadTimeout = 500;
            //lzj commex.ReceivedBytesThreshold = 52;//达到50字节以后才开始触发串口
            //commex.ReceivedBytesThreshold = 52;//达到50字节以后才开始触发串口
            commex.DataReceived += comDAC_DataReceived;
            return breturn;
        }
        private List<byte> buffer = new List<byte>(4096);
        public int iDAcount = 0;
        public DateTime comDA100;
        //void comDAC_DataReceived(object sender, SerialDataReceivedEventArgs e)
        //{

        //    if (commex.IsOpen)
        //    {
        //        int n = commex.BytesToRead;//
        //        if (iDAcount == 0)
        //        {
        //            iDAcount = n;
        //        }
        //        else if ((iDAcount + n) > 1000)
        //        {
        //            iDAcount = n;
        //        }
        //        else
        //        {
        //            iDAcount = iDAcount + n;
        //        }

        //        int ishuzu = 1000;
        //        if (ishuzu < iDAcount)
        //        {
        //            ishuzu = iDAcount;
        //        }





        //        byte[] buf1 = new byte[n];//声明一个临时数组存储当前来的串口数据  
        //        byte[] buf = new byte[ishuzu];
        //        commex.Read(buf1, 0, n);

        //        if (DateDiff(DateTime.Now, comDA100) > 100)
        //        {
        //            baocunriji("超时间未解析到数据", string.Format("{0}", iDAcount));
        //        }

        //        //baocunriji("信号板", string.Format("{0}", n));
        //        if (n > 25)
        //        {
        //            for (int j = 0; j < n; j++)
        //            {
        //                buf[iDAcount - n + j] = buf1[j];
        //            }
        //            for (int kk = iDAcount - 26; kk > 0; kk--)
        //            {
        //                if (buf[kk] == 0xFF)
        //                {
        //                    if (buf[kk + 23] == 0xFE)
        //                    {
        //                        short uSum1 = 0;
        //                        for (int i = 0; i < 24; i++)
        //                        {
        //                            uSum1 += buf[kk + i];
        //                        }

        //                        short uSum = 0;
        //                        uSum = (short)(buf[kk + 24] * 256 + buf[kk + 25]);
        //                        if (uSum1 == uSum)
        //                        {
        //                            comDA100 = DateTime.Now;
        //                            // baocunriji("信号板通过效验", string.Format("{0}", iDAcount));

        //                            //模拟
        //                            for (int i = 0; i < 5; i++)//模拟4路
        //                            {
        //                                int fAIDataxh = buf[kk + i * 4 + 2] * 256 * 256 + buf[kk + i * 4 + 3] * 256 + buf[kk + i * 4 + 4];
        //                                if (fAIDataxh > 0x03FFFF)
        //                                {
        //                                    fAIDataxh = 0 - (fAIDataxh ^ 0x7FFFF);
        //                                    fAIDataex[i] = fAIDataxh + (262143);//
        //                                }
        //                                else
        //                                {
        //                                    fAIDataex[i] = buf[kk + i * 4 + 2] * 256 * 256 + buf[kk + i * 4 + 3] * 256 + buf[kk + i * 4 + 4] + 262143;
        //                                }
        //                            }
        //                            ///////速度
        //                            for (int m = 0; m < 2; m++)// 
        //                            {

        //                                fTIData[m] = buf[kk + 19 + 2 * m] * 256 + buf[kk + 20 + 2 * m];

        //                            }
        //                            ////////红外
        //                            //66  18
        //                            for (int k = 0; k < 1; k++)//
        //                            {
        //                                if (buf[kk + k * 2 + 17] == 102)//红外
        //                                // if (true)
        //                                {
        //                                    string sdata = "";
        //                                    for (int i = 0; i < 8; i++)//红外
        //                                    {

        //                                        int ihongwai = 0;
        //                                        //ihongwai = buf[kk + k * 2 + 18] >> i;
        //                                        ihongwai = ((buf[kk + k * 2 + 18] & (int)Math.Pow(2, i)) == (int)Math.Pow(2, i)) ? 1 : 0;

        //                                        if (ihongwai == 1)
        //                                        {
        //                                            bDIData[i] = true;
        //                                        }
        //                                        else
        //                                        {
        //                                            bDIData[i] = false;
        //                                        }
        //                                        sdata = sdata + string.Format("{0}:", ihongwai);
        //                                    }

        //                                    // baocunriji("红外数据", string.Format("{0}", sdata));

        //                                }
        //                            }
        //                            ////////红外
        //                        }
        //                    }
        //                }
        //            }
        //        }
        //        commex.DiscardInBuffer();//buf
        //    }

        //}


        List<byte> xhblist = new List<byte>();
        //void comDAC_DataReceived(object sender, SerialDataReceivedEventArgs e)//20200715前使用的
        //{
        //    if (commex.IsOpen)
        //    {
        //        Thread.Sleep(5);
        //        int n = commex.BytesToRead;//
        //        byte[] buf1 = new byte[n];//声明一个临时数组存储当前来的串口数据  
        //        //byte[] buf = new byte[n];
        //        commex.Read(buf1, 0, n);
        //        for (int i = 0; i < buf1.Length; i++)
        //        {
        //            xhblist.Add(buf1[i]);
        //        }
        //        if (bdqxhb)
        //        {
        //            if (buf1.Length > 0)
        //            {
        //                StringBuilder strBuider1 = new StringBuilder();
        //                strBuider1.Append("");
        //                for (int index = 0; index < buf1.Length; index++)
        //                {
        //                    strBuider1.Append(((int)buf1[index]).ToString("X2") + " ");
        //                }
        //                Write(string.Format("./{0}信号.txt", sxhbmc), strBuider1.ToString());
        //                //baocunRJ("信号板接受指令", strBuider1.ToString());
        //            }
        //        }
        //        int icount = xhblist.Count;
        //        if (icount >= 26)
        //        {
        //            //for (int kk = n - 26; kk > n - 52; kk--)
        //            for (int kk = icount - 26; kk > 0; kk--)
        //            {
        //                if (xhblist[kk] == 0xFF && xhblist[kk + 23] == 0xFE)
        //                {
        //                    short uSum1 = 0;
        //                    for (int i = 0; i < 24; i++)
        //                    {
        //                        uSum1 += xhblist[kk + i];
        //                    }

        //                    short uSum = 0;
        //                    uSum = (short)(xhblist[kk + 24] * 256 + xhblist[kk + 25]);
        //                    if (uSum1 == uSum)
        //                    {
        //                        //模拟
        //                        for (int i = 0; i < 5; i++)//模拟4路
        //                        {
        //                            int fAIDataxh = xhblist[kk + i * 4 + 2] * 256 * 256 + xhblist[kk + i * 4 + 3] * 256 + xhblist[kk + i * 4 + 4];
        //                            if (fAIDataxh > 0x03FFFF)
        //                            {
        //                                fAIDataxh = 0 - (fAIDataxh ^ 0x7FFFF);
        //                                fAIDataex[i] = fAIDataxh + (262143);//
        //                            }
        //                            else
        //                            {
        //                                fAIDataex[i] = xhblist[kk + i * 4 + 2] * 256 * 256 + xhblist[kk + i * 4 + 3] * 256 + xhblist[kk + i * 4 + 4] + 262143;
        //                            }
        //                        }
        //                        ///////速度
        //                        for (int m = 0; m < 2; m++)// 
        //                        {

        //                            fTIData[m] = xhblist[kk + 19 + 2 * m] * 256 + xhblist[kk + 20 + 2 * m];

        //                        }
        //                        ////////红外
        //                        //66  18

        //                        for (int k = 0; k < 1; k++)//
        //                        {
        //                            for (int i = 0; i < 8; i++)//红外
        //                            {
        //                                int ihongwai = 0;
        //                                //  ihongwai = buf[kk + k * 2 + 18] >> i;
        //                                ihongwai = ((xhblist[kk + k * 2 + 18] & (int)Math.Pow(2, i)) == (int)Math.Pow(2, i)) ? 1 : 0;

        //                                if (ihongwai == 1)
        //                                {
        //                                    bDIData[i] = true;
        //                                }
        //                                else
        //                                {
        //                                    bDIData[i] = false;
        //                                }
        //                            }


        //                        }
        //                        ////////红外

        //                        //StringBuilder strBuider1 = new StringBuilder();
        //                        //for (int index = 0; index < icount; index++)
        //                        //{
        //                        //    strBuider1.Append(((int)xhblist[index]).ToString("X2") + " ");
        //                        //}
        //                        //baocunRJ("信号板接受指令", strBuider1.ToString());
        //                        xhblist.Clear();
        //                        break;
        //                    }
        //                }
        //            }
        //        }
        //    }
        //}

        //void comDAC_DataReceived(object sender, SerialDataReceivedEventArgs e)
        //{
        //    if (commex.IsOpen)
        //    {
        //        Thread.Sleep(30);
        //        int n = commex.BytesToRead;//

        //        byte[] buf1 = new byte[n];//声明一个临时数组存储当前来的串口数据  
        //        //byte[] buf = new byte[n];
        //        commex.Read(buf1, 0, n);
        //        if (n > 26)
        //        {
        //            for (int kk = 0; kk < n - 26; kk++)
        //            {
        //                if (buf1[kk] == 0xFF && buf1[kk + 23] == 0xFE)
        //                {
        //                    short uSum1 = 0;
        //                    for (int i = 0; i < 24; i++)
        //                    {
        //                        uSum1 += buf1[kk + i];
        //                    }

        //                    short uSum = 0;
        //                    uSum = (short)(buf1[kk + 24] * 256 + buf1[kk + 25]);
        //                    if (uSum1 == uSum)
        //                    {
        //                        //模拟
        //                        for (int i = 0; i < 5; i++)//模拟4路
        //                        {
        //                            int fAIDataxh = buf1[kk + i * 4 + 2] * 256 * 256 + buf1[kk + i * 4 + 3] * 256 + buf1[kk + i * 4 + 4];
        //                            if (fAIDataxh > 0x03FFFF)
        //                            {
        //                                fAIDataxh = 0 - (fAIDataxh ^ 0x7FFFF);
        //                                fAIDataex[i] = fAIDataxh + (262143);//
        //                            }
        //                            else
        //                            {
        //                                fAIDataex[i] = buf1[kk + i * 4 + 2] * 256 * 256 + buf1[kk + i * 4 + 3] * 256 + buf1[kk + i * 4 + 4] + 262143;
        //                            }
        //                        }
        //                        ///////速度
        //                        for (int m = 0; m < 2; m++)// 
        //                        {

        //                            fTIData[m] = buf1[kk + 19 + 2 * m] * 256 + buf1[kk + 20 + 2 * m];

        //                        }
        //                        ////////红外
        //                        //66  18
        //                        for (int k = 0; k < 1; k++)//
        //                        {
        //                            for (int i = 0; i < 8; i++)//红外
        //                            {
        //                                int ihongwai = 0;
        //                                //  ihongwai = buf[kk + k * 2 + 18] >> i;
        //                                ihongwai = ((buf1[kk + k * 2 + 18] & (int)Math.Pow(2, i)) == (int)Math.Pow(2, i)) ? 1 : 0;

        //                                if (ihongwai == 1)
        //                                {
        //                                    bDIData[i] = true;
        //                                }
        //                                else
        //                                {
        //                                    bDIData[i] = false;
        //                                }
        //                            }


        //                        }
        //                        ////////红外
        //                        break;
        //                    }
        //                }
        //            }
        //        }
        //    }

        //}
        public double DateDiff(DateTime DateTime1, DateTime DateTime2)
        {
            double dateDiff = 0;
            TimeSpan ts = DateTime1.Subtract(DateTime2).Duration();
            dateDiff = ts.Days * 60 * 60 * 60 * 1000 + ts.Hours * 60 * 60 * 1000 + ts.Minutes * 60 * 1000 + ts.Seconds * 1000 + ts.Milliseconds;
            return dateDiff;
        }
        //----------------------------------------------------------------------

        void comDAC_DataReceived(object sender, SerialDataReceivedEventArgs e)//每个协议都解析
        {
            //lock (this)
            {
                if (commex.IsOpen)
                {
                    Thread.Sleep(5);
                    int n = commex.BytesToRead;//
                    byte[] buf1 = new byte[n];//声明一个临时数组存储当前来的串口数据  
                    //byte[] buf = new byte[n];
                    commex.Read(buf1, 0, n);
                    for (int i = 0; i < buf1.Length; i++)
                    {
                        xhblist.Add(buf1[i]);
                    }
                    #region 写入txt日志
                    if (bdqxhb)
                    {
                        if (buf1.Length > 0)
                        {
                            StringBuilder strBuider1 = new StringBuilder();
                            strBuider1.Append(DateTime.Now.ToString("HH:mm:ss.fff") + ":");
                            for (int index = 0; index < buf1.Length; index++)
                            {
                                strBuider1.Append(((int)buf1[index]).ToString("X2") + " ");
                            }
                            Write(string.Format("./{0}信号.txt", sxhbmc), strBuider1.ToString() + "\r\n");
                            //baocunRJ("信号板接受指令", strBuider1.ToString());
                        }
                    }
                    //{
                    //    string sxhbjszl = string.Format("{0}:返回:{1}\r\n", DateTime.Now.ToString("HH:mm:ss.fff"), buf1.Length);
                    //    Write(string.Format("./信号板接收指令.txt"), sxhbjszl);
                    //}

                    #endregion
                    int icount = xhblist.Count;
                    if (icount >= 26)
                    {
                        #region 解析循环
                        int kk = 0;
                        bool bjxcg = false;
                        //for (int kk = icount - 26; kk > 0; kk--)
                        int ijlsz = 0;
                        for (kk = 0; kk <= icount - 26; kk++)
                        {
                            #region 判断是否开始与结束
                            if (xhblist[kk] == 0xFF && xhblist[kk + 23] == 0xFE)
                            {
                                short uSum1 = 0;
                                for (int i = 0; i < 24; i++)
                                {
                                    uSum1 += xhblist[kk + i];
                                }

                                short uSum = 0;
                                uSum = (short)(xhblist[kk + 24] * 256 + xhblist[kk + 25]);
                                #region 判断校验是否正确
                                if (uSum1 == uSum)
                                {
                                    ijlsz = kk;
                                    bjxcg = true;
                                    //{
                                    //    string sxhbjszl = string.Format("{0}:解析通过：长度n:{1} icount:{2}；解析通过点：{3}\r\n", DateTime.Now.ToString("HH:mm:ss.fff"), buf1.Length, xhblist.Count, kk);
                                    //    Write(string.Format("./信号板接收指令.txt"), sxhbjszl);
                                    //}
                                    #region 模拟信号取数
                                    //模拟
                                    for (int i = 0; i < 5; i++)//模拟4路
                                    {
                                        int fAIDataxh = xhblist[kk + i * 4 + 2] * 256 * 256 + xhblist[kk + i * 4 + 3] * 256 + xhblist[kk + i * 4 + 4];
                                        if (fAIDataxh > 0x03FFFF)
                                        {
                                            fAIDataxh = 0 - (fAIDataxh ^ 0x7FFFF);
                                            fAIDataex[i] = fAIDataxh + (262143);//
                                        }
                                        else
                                        {
                                            fAIDataex[i] = xhblist[kk + i * 4 + 2] * 256 * 256 + xhblist[kk + i * 4 + 3] * 256 + xhblist[kk + i * 4 + 4] + 262143;
                                        }
                                    }
                                    #endregion
                                    #region 速度信号取数
                                    ///////速度
                                    for (int m = 0; m < 2; m++)// 
                                    {

                                        fTIData[m] = xhblist[kk + 19 + 2 * m] * 256 + xhblist[kk + 20 + 2 * m];

                                    }
                                    ////////红外
                                    #endregion
                                    #region 红外信号取数
                                    for (int k = 0; k < 1; k++)//
                                    {
                                        for (int i = 0; i < 8; i++)//红外
                                        {
                                            int ihongwai = 0;
                                            //  ihongwai = buf[kk + k * 2 + 18] >> i;
                                            ihongwai = ((xhblist[kk + k * 2 + 18] & (int)Math.Pow(2, i)) == (int)Math.Pow(2, i)) ? 1 : 0;

                                            if (ihongwai == 1)
                                            {
                                                bDIData[i] = true;
                                            }
                                            else
                                            {
                                                bDIData[i] = false;
                                            }
                                        }


                                    }
                                    #endregion
                                }
                                #endregion
                            }
                            #endregion
                        }
                        #endregion
                        if (bjxcg)
                        {
                            //{
                            //    string sxhbjszl = string.Format("{0}:删除数组：长度n:{1} 起点:{2}；删除数量：{3}\r\n", DateTime.Now.ToString("HH:mm:ss.fff"), xhblist.Count, ijlsz, ijlsz + 26);
                            //    Write(string.Format("./信号板接收指令.txt"), sxhbjszl);
                            //}
                            xhblist.RemoveRange(0, ijlsz + 26);
                        }
                        else
                        {
                            //{
                            //    string sxhbjszl = string.Format("{0}:解析不通过：长度n:{1} \r\n", DateTime.Now.ToString("HH:mm:ss.fff"), xhblist.Count);
                            //    Write(string.Format("./信号板接收指令.txt"), sxhbjszl);
                            //}
                        }
                    }
                }
            }
        }

    }
}
